import axios from "axios";

// 创建 Axios 实例
// 区分开发和生产环境
const DEV_BASE_URL = "http://localhost:8101";
const PROD_BASE_URL = "http://xx.xx.xx.xx";
const myAxios = axios.create({
    baseURL: DEV_BASE_URL,
    timeout: 60000,
    withCredentials: true,
});

// 创建请求拦截器
myAxios.interceptors.request.use(
    function (config) {
        // 请求执行前执行
        return config;
    },
    function (error) {
        // 处理请求错误
        return Promise.reject(error);
    },
);

// 创建响应拦截器
myAxios.interceptors.response.use(
    // 2xx 响应触发
    function (response) {
        // 处理响应数据
        const { data } = response;
        
        // 如果是流式响应，直接返回响应对象
        if (response.headers['content-type']?.includes('text/event-stream')) {
            return response;
        }
        
        // 未登录
        if (data.code === 40100) {
            // 不是获取用户信息接口，或者不是登录页面，则跳转到登录页面
            if (
                !response.request.responseURL.includes("user/get/login") &&
                !window.location.pathname.includes("/user/login")
            ) {
                window.location.href = `/user/login?redirect=${window.location.href}`;
            }
        } else if (data.code !== 0) {
            // 其他错误
            throw new Error(data.message ?? "服务器错误");
        }
        return data;
    },
    // 非 2xx 响应触发
    function (error) {
        // 处理响应错误
        return Promise.reject(error);
    },
);

// 自定义请求方法，支持处理流式响应
const request = async <T = any>(url: string, options?: any): Promise<T> => {
    // 检查是否需要流式响应
    const isStreamResponse = url.includes('/chatStream') || options?.responseType === 'stream';
    
    if (isStreamResponse) {
        options = {
            ...options,
            responseType: 'stream',
            headers: {
                ...options?.headers,
                'Accept': 'text/event-stream',
            }
        };
    }
    
    return myAxios(url, options);
};

export default request;